# 数据库连接
import json
import logging

import config


logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')


def convert_json(data):
    # 提取单位名称和地址
    unit_name = data.get("单位名称", "")
    address = data.get("地址", "")

    # 创建新的联系人条目
    contact_person = {
        "联系人": data.get("联系人", ""),
        "电话": data.get("电话", "")
    }

    # 构造新的JSON对象
    new_data = {
        "单位名称": unit_name,
        "地址": address,
        "联系人和电话": [contact_person]
    }

    return new_data


# 转换为所需的JSON格式
def transform_to_desired_format(units):
    # 根据单位名称对单位进行分组
    grouped_units = {}
    for unit in units:
        if "*" in str(unit.get("电话")):
            continue
        if unit.get("电话") == "":
            continue
        unit_name = unit.get("单位名称")
        if unit_name in grouped_units:
            grouped_units[unit_name]['联系人和电话'].append({
                "联系人": unit.get("联系人"),
                "电话": unit.get("电话")
            })
        else:
            grouped_units[unit_name] = {
                "单位名称": unit_name,
                "地址": unit.get("地址"),
                "联系人和电话": [{
                    "联系人": unit.get("联系人"),
                    "电话": unit.get("电话")
                }]
            }

    # 将分组后的单位转换为所需的格式
    result = []
    for unit_name, grouped_unit in grouped_units.items():
        unit_copy = {
            "单位名称": unit_name,
            "地址": grouped_unit.get("地址"),
            "联系人和电话": grouped_unit.get("联系人和电话", [])
        }
        result.append(unit_copy)

    return result


def replace_str(json_str):
    # 去除多余的'''字符和将多行字符串转换为单行字符串
    json_str = json_str.replace("```", '').replace('\n', '').replace(' ', '').replace("json", "")

    # 尝试解析JSON字符串
    try:
        # 使用json.loads()函数解析JSON字符串
        parsed_json = json.loads(json_str)
        return json.dumps(parsed_json, ensure_ascii=False, indent=4)
    except json.JSONDecodeError as e:
        print(f"Error parsing JSON: {e}")


def remove_blank_lines(text):
    lines = text.split('\n')
    non_blank_lines = [line for line in lines if line.strip() != '']
    return '\n'.join(non_blank_lines)


def read_by_glm3turbo(page_text: object) -> str:
    from zhipuai import ZhipuAI
    import time
    client = ZhipuAI(api_key="9437fabb27c28a7b438fc30de753e2e0.R01Dwo5tBzFMiUVm")
    composite_prompt = """
    根据以下信息，回答以下问题：
    {page_text}
    提取以下字段
    项目名称、
    招标单位、
    招标地-省（输出省全称，如湖北=湖北省）、
    招标地-市（输出市全称，如北京=北京市）、
    招标地-区（取详细地区中的区，如果不存在输出为""）、
    所属行业（从项目名称进行判断对行业进行归类，匹配相近的行业分类如市政、公路、水运、水利、铁路、城轨、航空、建工、环境、食品，如果都匹配不上归类为其他，不允许出现其他分类）、
    更新时间、
    开工时间（时间格式转换为yyyy-mm-dd。智能补全如：2016-05 转换为 2016-05-01）、
    竣工时间（时间格式转换为yyyy-mm-dd。智能补全如：2016-05 转换为 2016-05-30）、
    进展阶段、
    项目性质、
    业主类型、
    项目类别、
    项目介绍（500字以内总结项目正文内容）、
    详细地区(如果不存在输出"")、
    项目子类别、
    业主单位（提取所有列单位名称、联系人、电话、职位、地址信息，每一列为一条json）、
    设计单位（提取所有列单位名称、联系人、电话、职位、地址信息，每一列为一条json）、
    施工单位（提取所有列单位名称、联系人、电话、职位、地址信息，每一列为一条json）、
    项目投资、
    建筑面积、
    占地面积、
    建筑物层数、
    钢结构、
    装修情况
    等信息
    (用JSON格式返回回答内容，其中json的key必须是上面提到的字段信息不允许输出上面未提到的字段信息)
    """.format(page_text=page_text)
    start_time = time.time()
    # print(composite_prompt)
    re = ""
    try:
        response = client.chat.completions.create(
            model="glm-3-turbo",  # 填写需要调用的模型名称
            temperature=0.5,
            max_tokens=8192,
            messages=[
                {"role": "system",
                 "content": "你是一个文本解析高手，你的任务是为用户提供高效快速的文本解析服务。并以json格式返回解析内容"},
                {"role": "user", "content": remove_blank_lines(composite_prompt)},
            ],
            stream=False,
            timeout=30
        )
        end_time = time.time()
        invoke_time = end_time - start_time
        print("耗时：" + str(invoke_time) + "秒")
        re = response.choices[0].message.content
    except Exception as e:
        # 捕获异常
        logging.error(f'模型返回时发生异常: {e}')
        # 继续执行循环
    return re


# 选择excel读取指定行内容


def read_nj_excel(file_path):
    from opr_mysql_database import MySQLDatabase
    from openpyxl import load_workbook
    db=MySQLDatabase(config.db_server)
    db.connect()

    wb = load_workbook(
        filename=file_path)
    # 加载现有的Excel文件
    sheet_names = wb.sheetnames
    # 从第二张工作表开始遍历
    for sheet_name in sheet_names[1:]:  # 从索引1开始，跳过第一张工作表
        ws = wb[sheet_name]  # 选择当前工作表
        cell_value = []  # 获取整个sheet页内容
        item_into = ws['B6'].value
        for row in ws.iter_rows(values_only=True):
            row_content = []
            for cell in row:
                if cell is not None:
                    row_content.append(str(cell))
            cell_value.append(row_content)
        db_row = read_by_glm3turbo(cell_value)
        print(db_row)
        content = cell_value
        item = ""
        try:
            json_obj = json.loads(replace_str(db_row))
            print(json_obj["项目名称"])
            item = json_obj["项目名称"]
            construction_org_tel = ""
            design_org_tel = ""
            owner_org_tel = ""
            if json_obj['施工单位'] is not None:
                if isinstance(json_obj['施工单位'], list) and json_obj['施工单位'] != []:
                    if transform_to_desired_format(json_obj['施工单位']) != []:
                        construction_org_tel = transform_to_desired_format(json_obj['施工单位'])[0]
                elif json_obj['施工单位'] == "" or json_obj['施工单位'] == []:
                    construction_org_tel = ""
                else:
                    construction_org_tel = convert_json(json_obj['施工单位'])

            if json_obj['设计单位'] is not None:
                if isinstance(json_obj['设计单位'], list) and json_obj['设计单位'] != []:
                    if transform_to_desired_format(json_obj['设计单位']) != []:
                        design_org_tel = transform_to_desired_format(json_obj['设计单位'])[0]
                elif json_obj['设计单位'] == "" or json_obj['设计单位'] == []:
                    design_org_tel = ""
                else:
                    design_org_tel = convert_json(json_obj['设计单位'])

            if json_obj['设计单位'] is not None:
                if isinstance(json_obj['业主单位'], list) and json_obj['业主单位'] != []:
                    if transform_to_desired_format(json_obj['业主单位']) != []:
                        owner_org_tel = transform_to_desired_format(json_obj['业主单位'])[0]
                elif json_obj['业主单位'] == "" or json_obj['业主单位'] == []:
                    owner_org_tel = ""
                else:
                    owner_org_tel = convert_json(json_obj['业主单位'])

            data = {
                'project_name': json_obj['项目名称'],
                'company': json_obj['招标单位'],
                'area': json_obj['招标地-省'],
                'city': json_obj['招标地-市'],
                'district': json_obj['招标地-区'],
                'industry': json_obj['所属行业'],
                'bid_update_time': None if json_obj['更新时间'] == "" else json_obj['更新时间'],
                'stage': json_obj['进展阶段'],
                'item_into': item_into,
                'item_nature': json_obj['项目性质'],
                'owner_type': json_obj['业主类型'],
                'item_type': json_obj['项目类别'],
                'item_sub_type': json_obj['项目子类别'],
                'detail_area': json_obj['详细地区'],
                'bid_amount': json_obj['项目投资'],
                'item_introduce': json_obj['项目介绍'],
                'owner_org': json_obj['业主单位'][0],
                'design_org': json_obj['设计单位'][0],
                'construction_org': json_obj['施工单位'][0],
                'construction_org_tel': json.dumps(construction_org_tel, ensure_ascii=False),
                'design_org_tel': json.dumps(design_org_tel, ensure_ascii=False),
                'owner_org_tel': json.dumps(owner_org_tel, ensure_ascii=False),
                'work_time': json_obj['开工时间'],
                'end_time': json_obj['竣工时间'],
                'floor_space': json_obj['占地面积'],
                'construction_num': json_obj['建筑物层数'],
                'steel_structure': json_obj['钢结构'],
                'decorate_situation': json_obj['装修情况'],
                'source_type': 3,
                'tenant_id': 1,
                'content': str(content)
            }
            print(data)

            db.insert('bid_source_data', data)

        except Exception as e:
            # 捕获异常
            logging.error(f'处理拟建- {item} 时发生异常: {e}')
            # 继续执行循环
            continue

    wb.close()
    # 将读取的指定行内容作为输入，访问LLM,返回结构化json数据

    db.close()

if __name__ == '__main__':
    read_nj_excel("D:\\data\\temp\\20240328_TIC3_d6c96746d3cb4a45b9647f86a6db4e54.xlsx")
